Chapter 01

Claude API란 무엇인가?

1.1 개요

Claude API는 Anthropic이 제공하는 RESTful API로, https://api.anthropic.com 엔드포인트를 통해 Claude 대규모 언어 모델(LLM)에 프로그래밍 방식으로 접근할 수 있게 해 줍니다. 채팅 인터페이스(claude.ai)에서 사람이 직접 대화하는 것과 달리, API를 사용하면 여러분의 웹 서비스, 모바일 앱, 자동화 파이프라인 등에서 Claude의 능력을 직접 활용할 수 있습니다.

1.2 무엇을 할 수 있는가?

Claude API로 구현할 수 있는 대표적인 활용 사례는 다음과 같습니다.

  • 텍스트 생성·요약·번역 : 문서 요약, 다국어 번역, 콘텐츠 생성
  • 코드 생성·리뷰·디버깅 : 코드를 작성하고, 버그를 찾고, 리팩토링을 제안
  • 이미지 분석 (Vision) : 이미지를 입력받아 내용을 설명하거나 분석
  • Tool Use (함수 호출) : 외부 API나 데이터베이스와 연동하여 실시간 정보 활용
  • 대화형 에이전트 : 고객 지원 챗봇, 업무 자동화 에이전트 구축
  • 데이터 분석·추출 : 비정형 데이터에서 구조화된 정보를 추출

1.3 제공되는 API 종류

API상태설명
Messages APIGAClaude와 대화 (핵심 API)
Message Batches APIGA대량 요청 비동기 처리 (50% 할인)
Token Counting APIGA토큰 수 사전 확인
Models APIGA사용 가능한 모델 목록 조회
Files APIBeta파일 업로드 및 관리
Agents / Sessions APIBeta클라우드 매니지드 에이전트 세션

1.4 접근 경로

Claude 모델은 Anthropic 직접 API 외에도 AWS Bedrock, Google Vertex AI, Microsoft Azure AI(Foundry)를 통해서도 사용할 수 있습니다. 직접 API를 사용하면 가장 최신 기능을 가장 먼저 이용할 수 있고, 클라우드 플랫폼을 사용하면 기존 인프라에 통합하기 편리합니다.

참고: 이 튜토리얼은 Anthropic 직접 API(1P)를 기준으로 설명합니다. AWS Bedrock이나 Vertex AI 사용법은 각 플랫폼 공식 문서를 참고하세요.
Chapter 02

모델 종류와 선택 가이드

2.1 Claude 모델 패밀리

Anthropic은 용도와 성능에 따라 세 가지 모델 라인을 제공합니다. Opus는 가장 강력한 추론 능력을, Sonnet은 속도와 성능의 균형을, Haiku는 가장 빠른 응답 속도를 제공합니다.

모델API ID컨텍스트최대 출력특징
Claude Opus 4.7claude-opus-4-71M 토큰128K 토큰최고 성능, 에이전틱 코딩 탁월
Claude Opus 4.6claude-opus-4-61M 토큰128K 토큰복잡한 추론, Fast Mode 지원
Claude Sonnet 4.6claude-sonnet-4-61M 토큰64K 토큰속도+지능 균형, Extended Thinking
Claude Haiku 4.5claude-haiku-4-5-20251001200K 토큰64K 토큰가장 빠름, 비용 효율적

2.2 모델 선택 기준

어떤 모델을 선택해야 할지 모르겠다면, 다음 기준을 참고하세요.

  • 최고 품질이 필요한 복잡한 작업 → Claude Opus 4.7 (수학 증명, 복잡한 코드 설계, 고난도 분석)
  • 일반적인 개발·비즈니스 작업 → Claude Sonnet 4.6 (코드 생성, 문서 작성, 데이터 분석)
  • 빠른 응답이 필요한 대량 처리 → Claude Haiku 4.5 (챗봇, 분류, 간단한 요약)

2.3 Knowledge Cutoff

각 모델은 학습 데이터의 마감 시점(Knowledge Cutoff)이 다릅니다. Opus 4.7은 2026년 1월까지의 정보를, Sonnet 4.6도 2026년 1월 학습 데이터를 활용합니다. 이 시점 이후의 최신 정보가 필요하다면 Web Search 도구를 함께 사용해야 합니다.

Tip! 처음 시작할 때는 Sonnet 4.6으로 프로토타입을 만들고, 품질이 부족하면 Opus로 업그레이드하는 전략을 추천합니다. 비용과 속도 면에서 효율적입니다.
Chapter 03

시작하기 (Setup)

3.1 API 키 발급

Claude API를 사용하려면 먼저 Anthropic Console에서 계정을 만들고 API 키를 발급받아야 합니다.

  1. console.anthropic.com에서 회원가입
  2. Settings → API Keys 에서 새 키 생성
  3. 키를 안전한 곳에 저장 (한 번만 표시됨)
  4. 최소 $5 크레딧 구매 (Tier 1 진입 조건)

3.2 SDK 설치

Anthropic은 Python, TypeScript, Java, Go, C#, Ruby, PHP 등 다양한 공식 SDK를 제공합니다. SDK를 사용하면 인증, 재시도, 에러 처리, 스트리밍 등을 자동으로 관리해 줍니다.

bash
# Python SDK 설치
pip install anthropic

# TypeScript/Node.js SDK 설치
npm install @anthropic-ai/sdk

3.3 환경 변수 설정

API 키를 코드에 직접 넣지 말고, 환경 변수로 관리하는 것이 보안상 안전합니다.

bash
# Linux / macOS
export ANTHROPIC_API_KEY="sk-ant-api03-xxxxx..."

# Windows (PowerShell)
$env:ANTHROPIC_API_KEY = "sk-ant-api03-xxxxx..."

3.4 첫 번째 API 호출

python
import anthropic

client = anthropic.Anthropic()  # 환경변수에서 API 키 자동 로드

message = client.messages.create(
    model="claude-sonnet-4-6",
    max_tokens=1024,
    messages=[
        {"role": "user", "content": "안녕하세요! Claude API를 처음 사용해 봅니다."}
    ]
)

print(message.content[0].text)
typescript
import Anthropic from "@anthropic-ai/sdk";

const client = new Anthropic(); // 환경변수에서 API 키 자동 로드

const message = await client.messages.create({
  model: "claude-sonnet-4-6",
  max_tokens: 1024,
  messages: [
    { role: "user", content: "안녕하세요! Claude API를 처음 사용해 봅니다." }
  ],
});

console.log(message.content[0].text);

3.5 cURL로 직접 호출

SDK 없이 HTTP 요청을 직접 보낼 수도 있습니다. 디버깅이나 테스트에 유용합니다.

bash (curl)
curl https://api.anthropic.com/v1/messages \
  -H "content-type: application/json" \
  -H "x-api-key: $ANTHROPIC_API_KEY" \
  -H "anthropic-version: 2023-06-01" \
  -d '{
    "model": "claude-sonnet-4-6",
    "max_tokens": 1024,
    "messages": [
      {"role": "user", "content": "Hello, Claude!"}
    ]
  }'

3.6 필수 인증 헤더

헤더필수
x-api-keyAPI 키 (sk-ant-...)Yes
anthropic-version2023-06-01Yes
content-typeapplication/jsonYes
주의! API 키는 절대 클라이언트 사이드(프론트엔드) 코드에 노출하지 마세요. 항상 서버 사이드에서 호출하거나, 프록시 서버를 통해 요청하세요.
Chapter 04

Messages API 기본

4.1 Messages API란?

Messages API는 Claude와 대화하기 위한 핵심 엔드포인트입니다. POST /v1/messages로 요청을 보내면, Claude가 메시지에 대한 응답을 생성하여 돌려줍니다. API는 상태가 없기(stateless) 때문에, 매 요청마다 전체 대화 이력을 함께 보내야 합니다.

4.2 요청 구조

json (request body)
{
  "model": "claude-sonnet-4-6",
  "max_tokens": 4096,
  "system": "당신은 친절한 한국어 도우미입니다.",
  "messages": [
    {"role": "user", "content": "파이썬으로 피보나치 수열을 구하는 함수를 짜줘."}
  ],
  "temperature": 0.7,
  "top_p": 0.9
}

4.3 주요 파라미터 설명

파라미터타입필수설명
modelstringYes사용할 모델 ID
max_tokensintegerYes최대 출력 토큰 수
messagesarrayYes대화 메시지 배열 (user/assistant 교대)
systemstringNo시스템 프롬프트 (Claude의 역할/행동 지침)
temperaturefloatNo랜덤성 (0.0=결정적, 1.0=창의적)
top_pfloatNoNucleus sampling (0~1)
stop_sequencesarrayNo응답을 멈출 문자열 목록
streambooleanNo스트리밍 응답 여부

4.4 응답 구조

json (response)
{
  "id": "msg_01XFDUDYJgAACzvnptvVoYEL",
  "type": "message",
  "role": "assistant",
  "content": [
    {
      "type": "text",
      "text": "다음은 파이썬으로 작성한 피보나치 수열 함수입니다..."
    }
  ],
  "model": "claude-sonnet-4-6",
  "stop_reason": "end_turn",
  "stop_sequence": null,
  "usage": {
    "input_tokens": 42,
    "output_tokens": 256
  }
}

4.5 멀티턴 대화

API는 stateless이므로, 이전 대화를 이어가려면 전체 대화 이력을 messages 배열에 담아야 합니다. user와 assistant 메시지를 번갈아 배치합니다.

python
response = client.messages.create(
    model="claude-sonnet-4-6",
    max_tokens=2048,
    system="당신은 파이썬 전문가입니다.",
    messages=[
        # 1턴: 사용자 질문
        {"role": "user", "content": "파이썬에서 리스트와 튜플의 차이는?"},
        # 1턴: Claude 응답 (이전 응답을 그대로 넣음)
        {"role": "assistant", "content": "리스트는 수정 가능(mutable)하고..."},
        # 2턴: 후속 질문
        {"role": "user", "content": "그렇다면 언제 튜플을 써야 하나요?"}
    ]
)

4.6 시스템 프롬프트 활용

시스템 프롬프트는 Claude의 행동, 성격, 규칙을 정의하는 특별한 지시문입니다. messages 배열과 별도로 system 파라미터에 지정합니다. 좋은 시스템 프롬프트는 일관된 응답 품질을 보장합니다.

python
response = client.messages.create(
    model="claude-sonnet-4-6",
    max_tokens=4096,
    system="""당신은 시니어 백엔드 개발자입니다.
규칙:
- 한국어로 답변합니다.
- 코드에는 항상 주석을 포함합니다.
- 보안 취약점이 있으면 반드시 경고합니다.
- 응답은 간결하고 실용적으로 합니다.""",
    messages=[
        {"role": "user", "content": "Node.js에서 JWT 인증을 구현하는 방법을 알려줘."}
    ]
)
stop_reason 값 의미:
end_turn — Claude가 자연스럽게 응답을 완료
max_tokens — max_tokens 한도에 도달하여 잘림
stop_sequence — 지정한 stop_sequences 문자열과 매치
tool_use — 도구 호출이 필요하여 중단 (Ch.7 참고)
Chapter 05

스트리밍 (Streaming)

5.1 왜 스트리밍이 필요한가?

일반적인 API 호출은 Claude의 전체 응답이 완성될 때까지 기다린 후 한꺼번에 받습니다. 긴 응답의 경우 수 초~수십 초를 기다려야 합니다. 스트리밍을 사용하면 응답이 생성되는 즉시 토큰 단위로 전달받을 수 있어, 사용자에게 실시간으로 텍스트가 나타나는 경험(ChatGPT처럼)을 제공할 수 있습니다.

5.2 Server-Sent Events (SSE)

Claude의 스트리밍은 SSE(Server-Sent Events) 프로토콜을 사용합니다. 요청 시 "stream": true를 설정하면, 서버가 응답을 작은 이벤트 단위로 보내줍니다.

5.3 Python SDK 스트리밍

python
import anthropic

client = anthropic.Anthropic()

# 방법 1: with 문 사용 (권장)
with client.messages.stream(
    model="claude-sonnet-4-6",
    max_tokens=2048,
    messages=[
        {"role": "user", "content": "양자 컴퓨팅의 원리를 설명해줘."}
    ]
) as stream:
    for text in stream.text_stream:
        print(text, end="", flush=True)

print()  # 줄바꿈

# 방법 2: 이벤트 기반 처리
with client.messages.stream(
    model="claude-sonnet-4-6",
    max_tokens=2048,
    messages=[
        {"role": "user", "content": "양자 컴퓨팅의 원리를 설명해줘."}
    ]
) as stream:
    for event in stream:
        if event.type == "content_block_delta":
            if event.delta.type == "text_delta":
                print(event.delta.text, end="", flush=True)

5.4 SSE 이벤트 타입

이벤트 타입설명
message_start메시지 시작, 메타 정보 포함
content_block_start콘텐츠 블록 시작 (text, thinking, tool_use)
content_block_delta콘텐츠 증분 (실제 텍스트 토큰)
content_block_stop콘텐츠 블록 종료
message_delta메시지 메타 업데이트 (stop_reason 등)
message_stop전체 메시지 완료

5.5 TypeScript 스트리밍

typescript
import Anthropic from "@anthropic-ai/sdk";

const client = new Anthropic();

const stream = client.messages.stream({
  model: "claude-sonnet-4-6",
  max_tokens: 2048,
  messages: [
    { role: "user", content: "양자 컴퓨팅의 원리를 설명해줘." }
  ],
});

// 텍스트만 간단히 출력
stream.on("text", (text) => {
  process.stdout.write(text);
});

// 완료 후 최종 메시지 확인
const finalMessage = await stream.finalMessage();
console.log("\n\nTotal tokens:", finalMessage.usage);
Tip! 스트리밍은 단순히 UX를 개선하는 것 이상의 이점이 있습니다. TTFT(Time to First Token, 첫 토큰까지의 시간)을 크게 단축하여 사용자 체감 속도를 높이며, 긴 응답에서 네트워크 타임아웃을 방지할 수 있습니다.
Chapter 06

멀티모달 (Vision)

6.1 이미지 입력 기능

Claude는 텍스트뿐 아니라 이미지도 입력으로 받을 수 있습니다. 사진 속 텍스트를 읽거나, 차트를 분석하거나, UI 스크린샷을 설명하는 등 다양한 시각 관련 작업을 수행할 수 있습니다. 지원하는 이미지 형식은 JPEG, PNG, GIF, WebP입니다.

6.2 이미지 전달 방법

이미지를 Claude에 전달하는 방법은 세 가지입니다.

  • Base64 인코딩 : 이미지를 Base64 문자열로 변환하여 직접 포함
  • URL 참조 : 공개 접근 가능한 이미지 URL을 지정
  • Files API : 사전에 업로드한 파일 ID를 참조

6.3 Base64 방식 예제

python
import anthropic
import base64

client = anthropic.Anthropic()

# 이미지 파일을 Base64로 변환
with open("chart.png", "rb") as f:
    image_data = base64.standard_b64encode(f.read()).decode("utf-8")

response = client.messages.create(
    model="claude-sonnet-4-6",
    max_tokens=2048,
    messages=[
        {
            "role": "user",
            "content": [
                {
                    "type": "image",
                    "source": {
                        "type": "base64",
                        "media_type": "image/png",
                        "data": image_data
                    }
                },
                {
                    "type": "text",
                    "text": "이 차트의 핵심 트렌드를 분석해 주세요."
                }
            ]
        }
    ]
)

print(response.content[0].text)

6.4 URL 방식 예제

python
response = client.messages.create(
    model="claude-sonnet-4-6",
    max_tokens=2048,
    messages=[
        {
            "role": "user",
            "content": [
                {
                    "type": "image",
                    "source": {
                        "type": "url",
                        "url": "https://example.com/dashboard-screenshot.png"
                    }
                },
                {
                    "type": "text",
                    "text": "이 대시보드에서 매출이 가장 높은 달은?"
                }
            ]
        }
    ]
)

6.5 여러 이미지 동시 입력

하나의 메시지에 여러 이미지를 포함할 수 있습니다. 이미지 간 비교 분석, 여러 페이지의 문서 처리 등에 활용됩니다.

이미지 처리 팁:
• 이미지 크기가 클수록 토큰 소비가 증가합니다 (평균 웹 이미지 ~1,000-2,000 토큰)
• 고해상도가 반드시 더 좋은 결과를 주는 것은 아닙니다. 필요한 정보가 보이면 충분합니다
• 텍스트가 많은 이미지(문서, 표)는 Claude가 잘 읽습니다
• PDF도 지원됩니다 (최대 100페이지)
Chapter 07

Tool Use (함수 호출)

7.1 Tool Use란?

Tool Use는 Claude가 여러분이 정의한 외부 함수(도구)를 호출할 수 있게 하는 기능입니다. Claude는 사용자의 요청을 분석한 뒤, 적절한 도구를 선택하고 필요한 인자를 구조화하여 반환합니다. 실제 함수 실행은 여러분의 코드에서 담당하며, 결과를 다시 Claude에게 전달하면 최종 응답을 생성합니다.

이 메커니즘을 통해 Claude는 실시간 날씨 조회, 데이터베이스 검색, 이메일 발송, 계산기 사용 등 LLM 단독으로는 불가능한 작업을 수행할 수 있습니다.

7.2 동작 흐름

  1. 여러분이 도구 정의(이름, 설명, 파라미터 스키마)와 사용자 메시지를 함께 전송
  2. Claude가 적절한 도구를 선택하고, 인자를 채워서 tool_use 블록을 반환
  3. 여러분의 코드가 해당 함수를 실행하고 결과를 얻음
  4. 결과를 tool_result로 Claude에게 전달
  5. Claude가 결과를 바탕으로 최종 답변을 생성

7.3 도구 정의 예제

python
import anthropic

client = anthropic.Anthropic()

# 도구(함수) 정의
tools = [
    {
        "name": "get_weather",
        "description": "지정된 도시의 현재 날씨 정보를 반환합니다.",
        "input_schema": {
            "type": "object",
            "properties": {
                "city": {
                    "type": "string",
                    "description": "날씨를 조회할 도시 이름 (예: 서울, Tokyo)"
                },
                "unit": {
                    "type": "string",
                    "enum": ["celsius", "fahrenheit"],
                    "description": "온도 단위"
                }
            },
            "required": ["city"]
        }
    }
]

# 1단계: Claude에게 요청
response = client.messages.create(
    model="claude-sonnet-4-6",
    max_tokens=1024,
    tools=tools,
    messages=[
        {"role": "user", "content": "서울 날씨 어때?"}
    ]
)

# 2단계: Claude가 도구 호출을 요청하면 처리
if response.stop_reason == "tool_use":
    tool_block = next(b for b in response.content if b.type == "tool_use")
    
    print(f"호출할 도구: {tool_block.name}")
    print(f"인자: {tool_block.input}")
    # → 호출할 도구: get_weather
    # → 인자: {"city": "서울", "unit": "celsius"}
    
    # 3단계: 실제 함수 실행 (여기서는 가상 결과)
    weather_result = {"temperature": 22, "condition": "맑음", "humidity": 45}
    
    # 4단계: 결과를 Claude에게 전달
    final_response = client.messages.create(
        model="claude-sonnet-4-6",
        max_tokens=1024,
        tools=tools,
        messages=[
            {"role": "user", "content": "서울 날씨 어때?"},
            {"role": "assistant", "content": response.content},
            {
                "role": "user",
                "content": [
                    {
                        "type": "tool_result",
                        "tool_use_id": tool_block.id,
                        "content": str(weather_result)
                    }
                ]
            }
        ]
    )
    
    print(final_response.content[0].text)
    # → "서울의 현재 날씨는 맑고, 기온은 22°C이며 습도는 45%입니다."

7.4 도구의 종류

구분실행 위치예시
Client Tools (사용자 정의)여러분의 서버DB 조회, 외부 API 호출, 파일 처리
Server Tools (Anthropic 제공)Anthropic 인프라web_search, web_fetch, code_execution

7.5 서버 도구 (Web Search) 사용

python
# 웹 검색 도구 사용 (Anthropic이 실행을 처리)
response = client.messages.create(
    model="claude-sonnet-4-6",
    max_tokens=2048,
    tools=[{"type": "web_search_20260209"}],
    messages=[
        {"role": "user", "content": "오늘 한국 주식시장 상황을 알려줘."}
    ]
)

# 서버 도구는 별도 실행 없이 바로 결과 포함
print(response.content[-1].text)
Tip! 도구의 description을 상세하게 작성할수록 Claude가 적절한 도구를 정확하게 선택합니다. "필수 파라미터", "언제 이 도구를 사용해야 하는지", "반환값 형태" 등을 설명에 포함하세요.
Chapter 08

Extended Thinking (확장 사고)

8.1 개념

Extended Thinking은 Claude가 최종 답변을 내놓기 전에 내부적으로 깊이 사고하는 과정을 활성화하는 기능입니다. 복잡한 수학 문제, 다단계 추론, 코드 아키텍처 설계 등에서 응답 품질을 크게 향상시킵니다.

이 기능을 켜면 응답에 thinking 블록이 추가되어, Claude가 어떤 과정으로 결론에 도달했는지 확인할 수 있습니다(요약 형태로 제공).

8.2 모델별 사용법 차이

모델권장 방식설정
Opus 4.7Adaptive Thinkingthinking: {type: "adaptive"} + effort 파라미터
Opus 4.6Adaptive Thinking (권장)thinking: {type: "adaptive"}
Sonnet 4.6Adaptive Thinking (권장)thinking: {type: "adaptive"}
Haiku 4.5Manual Extended Thinkingthinking: {type: "enabled", budget_tokens: N}

8.3 사용 예제

python
import anthropic

client = anthropic.Anthropic()

# Sonnet 4.6에서 Extended Thinking 사용
response = client.messages.create(
    model="claude-sonnet-4-6",
    max_tokens=16000,
    thinking={"type": "enabled", "budget_tokens": 10000},
    messages=[
        {
            "role": "user",
            "content": "n mod 4 == 3인 소수가 무한히 많은지 증명해줘."
        }
    ]
)

# 응답에서 thinking과 text 블록을 구분
for block in response.content:
    if block.type == "thinking":
        print(f"[사고 과정 요약]\n{block.thinking}\n")
    elif block.type == "text":
        print(f"[최종 답변]\n{block.text}")

8.4 Adaptive Thinking (Opus 4.7)

python
# Opus 4.7은 adaptive thinking + effort를 사용
response = client.messages.create(
    model="claude-opus-4-7",
    max_tokens=16000,
    thinking={"type": "adaptive"},  # budget_tokens 대신 adaptive
    messages=[
        {
            "role": "user",
            "content": "다음 시스템의 보안 취약점을 분석하고 개선 방안을 제시해줘..."
        }
    ]
)

8.5 핵심 주의사항

주의사항:
budget_tokensmax_tokens보다 작아야 합니다
• Claude 4 모델의 thinking은 요약본으로 제공됩니다 (원본 접근은 영업팀 문의)
• thinking 토큰은 출력 토큰으로 과금됩니다 (요약본이 아닌 원본 기준)
• Opus 4.7에서 type: "enabled"를 사용하면 400 에러 발생
언제 Extended Thinking을 사용할까?
• 복잡한 수학/논리 문제
• 멀티스텝 코드 디버깅
• 아키텍처 설계 및 의사결정
• 법률/금융 분석
• 정확도가 극도로 중요한 작업
Chapter 09

프롬프트 캐싱 (Prompt Caching)

9.1 프롬프트 캐싱이란?

프롬프트 캐싱은 동일한 프롬프트 접두사를 반복 사용할 때 처리 시간과 비용을 획기적으로 줄이는 기능입니다. 긴 시스템 프롬프트, 대량의 문서 컨텍스트, 도구 정의 등 매 요청마다 반복되는 부분을 캐시에 저장해 두고, 이후 요청에서는 캐시에서 읽어옵니다.

캐시 히트 시 비용은 기본 입력 토큰 가격의 10%에 불과하며, 지연 시간도 2배 이상 단축됩니다.

9.2 캐싱 방식

방식설명적합한 경우
자동 캐싱최상위 cache_control 필드 추가, 시스템이 자동 관리대부분의 경우 권장
수동 캐싱개별 콘텐츠 블록에 cache_control 배치세밀한 제어가 필요할 때

9.3 캐시 가격 구조

캐시 작업배수유효 시간
5분 캐시 쓰기 (Write)기본 입력가의 1.25x5분
1시간 캐시 쓰기 (Write)기본 입력가의 2x1시간
캐시 읽기 (Hit)기본 입력가의 0.1x-

즉, 5분 캐시는 단 1회 재사용만으로도 본전을 뽑고, 1시간 캐시는 2회 재사용부터 이득입니다.

9.4 구현 예제

python
import anthropic

client = anthropic.Anthropic()

# 긴 시스템 프롬프트 + 문서를 캐싱
long_document = "..." * 10000  # 매우 긴 문서

response = client.messages.create(
    model="claude-sonnet-4-6",
    max_tokens=2048,
    system=[
        {
            "type": "text",
            "text": "당신은 법률 문서 분석 전문가입니다.",
        },
        {
            "type": "text",
            "text": f"다음은 분석할 계약서입니다:\n\n{long_document}",
            "cache_control": {"type": "ephemeral"}  # 이 부분을 캐시
        }
    ],
    messages=[
        {"role": "user", "content": "이 계약서에서 위약금 조항을 찾아줘."}
    ]
)

# 응답의 usage에서 캐시 상태 확인
print(f"캐시 생성 토큰: {response.usage.cache_creation_input_tokens}")
print(f"캐시 읽기 토큰: {response.usage.cache_read_input_tokens}")
print(f"일반 입력 토큰: {response.usage.input_tokens}")

9.5 캐싱이 효과적인 사례

  • 긴 시스템 프롬프트 : 수천 토큰의 지침이 매 요청 반복될 때
  • 문서 기반 Q&A : 동일 문서에 여러 질문을 할 때
  • 도구 정의 : 많은 도구를 정의한 에이전트
  • 대화 이력 : 이전 대화가 길어질수록 캐싱 효과 증가
Tip! Rate Limit 관점에서도 캐싱은 유리합니다. 캐시 히트 토큰은 대부분의 모델에서 ITPM(분당 입력 토큰) 한도에 포함되지 않으므로, 실질적인 처리량을 크게 늘릴 수 있습니다.
Chapter 10

요금 체계 (Pricing)

10.1 토큰 기반 과금

Claude API는 처리한 토큰 수에 따라 과금됩니다. 토큰은 텍스트의 조각으로, 영어 기준 대략 1 토큰 ≈ 4글자 ≈ 0.75단어입니다. 한국어는 평균적으로 1글자 ≈ 1~2토큰 정도 소비됩니다. 입력 토큰과 출력 토큰이 별도로 과금되며, 출력 토큰이 더 비쌉니다.

10.2 모델별 기본 가격 (MTok = 백만 토큰)

모델입력 ($/MTok)출력 ($/MTok)특징
Claude Opus 4.7$5$25최고 성능
Claude Opus 4.6$5$25Fast Mode 지원
Claude Opus 4.5$5$25
Claude Sonnet 4.6$3$15속도+성능 균형
Claude Sonnet 4.5$3$15
Claude Haiku 4.5$1$5가장 경제적

10.3 Batch API (50% 할인)

실시간 응답이 필요 없는 대량 작업에는 Batch API를 사용하면 입출력 모두 50% 할인됩니다. 결과는 최대 24시간 내에 비동기적으로 처리됩니다.

모델Batch 입력 ($/MTok)Batch 출력 ($/MTok)
Opus 4.7 / 4.6 / 4.5$2.50$12.50
Sonnet 4.6 / 4.5$1.50$7.50
Haiku 4.5$0.50$2.50

10.4 추가 비용 발생 도구

도구/기능추가 비용
Web Search$10 / 1,000회 검색 + 토큰 비용
Web Fetch추가 비용 없음 (토큰 비용만)
Code Execution (단독)$0.05/시간 (월 1,550시간 무료)
Fast Mode (Opus 4.6)6배 프리미엄 ($30/$150 MTok)

10.5 비용 절감 전략

  • 프롬프트 캐싱 활용 : 반복되는 컨텍스트 비용을 90%까지 절감
  • 적절한 모델 선택 : 간단한 작업에 Opus를 쓰지 말 것
  • Batch API 활용 : 실시간 불필요한 대량 작업은 50% 절약
  • max_tokens 적절 설정 : 불필요하게 긴 출력 방지
  • Token Counting API : 전송 전 토큰 수 확인으로 예산 관리
비용 계산 예시:
Sonnet 4.6으로 고객 지원 챗봇을 운영한다고 가정합니다. 평균 대화가 입력 2,000토큰 + 출력 500토큰이라면:
• 1회 대화 비용 = (2,000 × $3 / 1M) + (500 × $15 / 1M) = $0.006 + $0.0075 = 약 $0.0135
• 하루 1,000건 = 약 $13.5 / 일
• 캐싱 적용 시 입력 비용 ~90% 절감 가능
Chapter 11

Rate Limit & 최적화

11.1 Rate Limit 구조

API는 남용 방지와 자원 배분을 위해 분당 요청 수(RPM), 분당 입력 토큰 수(ITPM), 분당 출력 토큰 수(OTPM)를 제한합니다. 이 한도는 사용 티어(Tier)에 따라 자동으로 상향됩니다.

티어진입 조건 (누적 구매)월 지출 한도
Tier 1$5$100/월
Tier 2$40$500/월
Tier 3$200$1,000/월
Tier 4$400$200,000/월
Monthly Invoicing영업팀 협의무제한

11.2 Tier 1 기본 Rate Limit

모델RPM (요청/분)ITPM (입력 토큰/분)OTPM (출력 토큰/분)
Opus 4.x (통합)5030,0008,000
Sonnet 4.x (통합)5030,0008,000
Haiku 4.55050,00010,000

11.3 429 에러 처리

Rate Limit에 도달하면 HTTP 429 에러가 반환됩니다. 응답 헤더의 retry-after 값을 확인하고, 해당 시간이 지난 후 재시도해야 합니다.

python
import anthropic
import time

client = anthropic.Anthropic()

def call_with_retry(messages, max_retries=5):
    """지수 백오프를 적용한 재시도 로직"""
    for attempt in range(max_retries):
        try:
            response = client.messages.create(
                model="claude-sonnet-4-6",
                max_tokens=1024,
                messages=messages
            )
            return response
        except anthropic.RateLimitError as e:
            if attempt == max_retries - 1:
                raise
            wait_time = 2 ** attempt  # 1, 2, 4, 8, 16초
            print(f"Rate limit 도달. {wait_time}초 후 재시도...")
            time.sleep(wait_time)
    return None

11.4 캐시와 Rate Limit의 관계

대부분의 모델에서 캐시 히트 토큰은 ITPM 한도에 포함되지 않습니다. 즉, 프롬프트 캐싱을 활용하면 실질적으로 처리할 수 있는 토큰 양이 크게 증가합니다.

예시: ITPM 한도가 2,000,000이고 캐시 히트율이 80%라면, 실질적으로 분당 10,000,000 토큰(2M 비캐시 + 8M 캐시)을 처리할 수 있습니다.

11.5 최적화 베스트 프랙티스

  • 지수 백오프(Exponential Backoff) : 429 에러 시 점진적으로 대기 시간 증가
  • 프롬프트 캐싱 : 반복 컨텍스트 캐싱으로 실질 처리량 향상
  • 병렬 요청 제한 : RPM을 초과하지 않도록 동시 요청 수 제어
  • 급격한 트래픽 증가 방지 : 점진적으로 사용량을 늘리기 (가속 제한 회피)
  • Workspace별 한도 분리 : 중요한 서비스와 실험을 분리하여 과사용 방지
Chapter 12

실전 활용 & 치트시트

12.1 실전: 고객 지원 챗봇

python
import anthropic

client = anthropic.Anthropic()

SYSTEM_PROMPT = """당신은 '테크마트' 온라인 쇼핑몰의 고객 지원 AI입니다.

규칙:
1. 항상 친절하고 공손한 한국어로 답변합니다.
2. 환불/교환 문의 시 주문번호를 먼저 확인합니다.
3. 모르는 내용은 "상담원 연결"을 안내합니다.
4. 개인정보(카드번호, 비밀번호 등)는 절대 요청하지 않습니다.

상품 정보:
- 배송: 결제 후 1-3 영업일
- 교환/환불: 수령 후 7일 이내
- 고객센터: 1588-0000 (평일 9-18시)"""

def chat(conversation_history: list, user_message: str) -> str:
    """대화 이력을 유지하며 응답 생성"""
    conversation_history.append(
        {"role": "user", "content": user_message}
    )
    
    response = client.messages.create(
        model="claude-haiku-4-5-20251001",  # 빠른 응답 위해 Haiku
        max_tokens=512,
        system=SYSTEM_PROMPT,
        messages=conversation_history
    )
    
    assistant_message = response.content[0].text
    conversation_history.append(
        {"role": "assistant", "content": assistant_message}
    )
    
    return assistant_message

# 사용 예시
history = []
print(chat(history, "배송은 얼마나 걸려요?"))
print(chat(history, "교환하고 싶은데 어떻게 해야 하나요?"))

12.2 실전: 구조화된 데이터 추출

python
import anthropic
import json

client = anthropic.Anthropic()

# Tool을 사용한 구조화된 출력 (Structured Outputs)
tools = [
    {
        "name": "extract_receipt",
        "description": "영수증에서 정보를 추출합니다.",
        "input_schema": {
            "type": "object",
            "properties": {
                "store_name": {"type": "string", "description": "매장명"},
                "date": {"type": "string", "description": "구매일 (YYYY-MM-DD)"},
                "items": {
                    "type": "array",
                    "items": {
                        "type": "object",
                        "properties": {
                            "name": {"type": "string"},
                            "quantity": {"type": "integer"},
                            "price": {"type": "number"}
                        },
                        "required": ["name", "quantity", "price"]
                    }
                },
                "total": {"type": "number", "description": "총 결제 금액"}
            },
            "required": ["store_name", "date", "items", "total"]
        }
    }
]

receipt_text = """
마트24 강남점
2024-12-15
우유 1L x2  3,400원
식빵     x1  2,800원
계란 30구 x1  6,900원
합계: 13,100원
"""

response = client.messages.create(
    model="claude-sonnet-4-6",
    max_tokens=1024,
    tools=tools,
    tool_choice={"type": "tool", "name": "extract_receipt"},
    messages=[
        {"role": "user", "content": f"다음 영수증에서 정보를 추출해줘:\n{receipt_text}"}
    ]
)

# 구조화된 JSON 결과
result = response.content[0].input
print(json.dumps(result, ensure_ascii=False, indent=2))
추출 결과 (JSON)
{ "store_name": "마트24 강남점", "date": "2024-12-15", "items": [ {"name": "우유 1L", "quantity": 2, "price": 3400}, {"name": "식빵", "quantity": 1, "price": 2800}, {"name": "계란 30구", "quantity": 1, "price": 6900} ], "total": 13100 }

12.3 API 호출 치트시트

python (cheat sheet)
# =============================================
# Claude API 치트시트 - 핵심 패턴 모음
# =============================================

import anthropic
client = anthropic.Anthropic()

# ── 1. 기본 호출 ──
response = client.messages.create(
    model="claude-sonnet-4-6",
    max_tokens=1024,
    messages=[{"role": "user", "content": "Hello!"}]
)

# ── 2. 시스템 프롬프트 ──
response = client.messages.create(
    model="claude-sonnet-4-6",
    max_tokens=1024,
    system="당신은 한국어 번역가입니다.",
    messages=[{"role": "user", "content": "Translate: Hello World"}]
)

# ── 3. 스트리밍 ──
with client.messages.stream(
    model="claude-sonnet-4-6",
    max_tokens=1024,
    messages=[{"role": "user", "content": "긴 이야기를 해줘."}]
) as stream:
    for text in stream.text_stream:
        print(text, end="", flush=True)

# ── 4. 이미지 입력 (URL) ──
response = client.messages.create(
    model="claude-sonnet-4-6",
    max_tokens=1024,
    messages=[{
        "role": "user",
        "content": [
            {"type": "image", "source": {"type": "url", "url": "https://..."}},
            {"type": "text", "text": "이 이미지를 설명해줘."}
        ]
    }]
)

# ── 5. Tool Use ──
tools = [{"name": "calc", "description": "계산기",
          "input_schema": {"type": "object",
                           "properties": {"expression": {"type": "string"}},
                           "required": ["expression"]}}]
response = client.messages.create(
    model="claude-sonnet-4-6",
    max_tokens=1024,
    tools=tools,
    messages=[{"role": "user", "content": "2^10 계산해줘"}]
)

# ── 6. Extended Thinking ──
response = client.messages.create(
    model="claude-sonnet-4-6",
    max_tokens=16000,
    thinking={"type": "enabled", "budget_tokens": 10000},
    messages=[{"role": "user", "content": "복잡한 문제..."}]
)

# ── 7. 프롬프트 캐싱 ──
response = client.messages.create(
    model="claude-sonnet-4-6",
    max_tokens=1024,
    system=[{
        "type": "text",
        "text": "매우 긴 시스템 프롬프트...",
        "cache_control": {"type": "ephemeral"}
    }],
    messages=[{"role": "user", "content": "질문"}]
)

# ── 8. Batch API ──
batch = client.messages.batches.create(
    requests=[
        {"custom_id": "req-1",
         "params": {"model": "claude-sonnet-4-6",
                    "max_tokens": 1024,
                    "messages": [{"role": "user", "content": "질문1"}]}},
        {"custom_id": "req-2",
         "params": {"model": "claude-sonnet-4-6",
                    "max_tokens": 1024,
                    "messages": [{"role": "user", "content": "질문2"}]}}
    ]
)

# ── 9. 토큰 카운팅 ──
count = client.messages.count_tokens(
    model="claude-sonnet-4-6",
    messages=[{"role": "user", "content": "Hello!"}]
)
print(f"입력 토큰: {count.input_tokens}")

# ── 10. Web Search (서버 도구) ──
response = client.messages.create(
    model="claude-sonnet-4-6",
    max_tokens=2048,
    tools=[{"type": "web_search_20260209"}],
    messages=[{"role": "user", "content": "최신 뉴스 검색해줘"}]
)

12.4 자주 하는 실수 & 해결법

실수증상해결법
API 키를 프론트엔드에 노출키 유출, 과금 폭탄항상 서버 사이드에서 호출
max_tokens 미설정에러 발생 (필수 파라미터)항상 명시적으로 설정
messages 순서 오류400 에러user/assistant 반드시 교대 배치
대화 이력 누락맥락 없는 응답이전 대화 전체를 매번 포함
stream + tool_use 혼합 오류파싱 실패이벤트 타입별 분기 처리 구현
Opus 4.7에서 budget_tokens 사용400 에러adaptive thinking 사용
캐시 최소 토큰 미달캐시 미생성최소 1,024 토큰 이상 캐싱
Rate Limit 무시429 에러 반복지수 백오프 + retry-after 준수

12.5 유용한 리소스

리소스URL설명
공식 문서platform.claude.com/docs가장 정확한 최신 정보
API Referenceplatform.claude.com/docs/en/api/overview엔드포인트 상세 스펙
Anthropic Cookbookgithub.com/anthropics/anthropic-cookbook예제 코드 모음
Console (Workbench)console.anthropic.com브라우저에서 API 테스트
Prompt Engineering Guideplatform.claude.com/docs/en/build-with-claude/prompt-engineering프롬프트 작성법
Discordanthropic.com/discord커뮤니티 지원

12.6 마치며

Claude API는 단순한 텍스트 생성 API를 넘어, Vision, Tool Use, Extended Thinking, 프롬프트 캐싱, Batch 처리 등 다양한 기능을 제공하는 종합 AI 플랫폼입니다. 이 튜토리얼에서 다룬 내용을 바탕으로 실제 프로젝트에 Claude를 통합해 보세요.

Claude API 활용의 3가지 핵심 원칙:

1. 적절한 모델을 선택하세요 — 모든 작업에 Opus를 쓸 필요 없습니다. 간단한 작업은 Haiku, 일반 작업은 Sonnet, 복잡한 추론만 Opus를 사용하면 비용을 10배 이상 절약할 수 있습니다.

2. 시스템 프롬프트를 정성껏 설계하세요 — 좋은 시스템 프롬프트 하나가 응답 품질을 극적으로 바꿉니다. 역할, 규칙, 출력 형식, 예시를 명확히 포함하세요.

3. 캐싱과 배치를 적극 활용하세요 — 반복 컨텍스트에는 캐싱을, 비실시간 대량 작업에는 Batch API를 사용하면 비용과 속도 모두 최적화할 수 있습니다.